package controllers;


import static play.data.Form.form;
import models.Usuario;
import play.data.Form;
import play.mvc.Controller;
import play.mvc.Result;
import views.html.usuarios.createForm;
import views.html.usuarios.editForm;
import views.html.usuarios.list;

public class Usuarios extends Controller {
	
    public static Result GO_USUARIOS = redirect(
        routes.Usuarios.list(0, "nome", "asc", "")
    );
    
    /**
     * Trata requisicoes a url padrao, redireciona para lista de usuarios
     */
    public static Result index() {
        return GO_USUARIOS;
    }

    /**
     * Mostra lista de usuarios paginada
     *
     * @param page Numero da pagina atual (comecando em  0)
     * @param sortBy Coluna atraves da qual dados estao sendo ordenados
     * @param order Tipo de ordenacao  (asc ou desc)
     * @param filter Filtro aplicado or nome dos usuarios
     */
    public static Result list(int page, String sortBy, String order, String filter) {
        return ok(
        	list.render(
                Usuario.page(page, 10, sortBy, order, filter),
                sortBy, order, filter
            )
        );
    }
    
    /**
     * Mostra o form de edicao de um usuario
     *
     * @param id Id do usuário a ser editado
     */
    public static Result edit(Long id) {
        Form<Usuario> usuarioForm = form(Usuario.class).fill(
            Usuario.find.byId(id)
        );
        return ok(
            editForm.render(id, usuarioForm)
        );
    }
    
    /**
     * Trata a submissao do form de edicao
     *
     * @param id Id do usuario a ser editado
     */
    public static Result update(Long id) {
        Form<Usuario> usuarioForm = form(Usuario.class).bindFromRequest();
       
        // Check repeated password
        if(!usuarioForm.field("senha").valueOr("").isEmpty()) {
            if(!usuarioForm.field("senha").valueOr("").equals(usuarioForm.field("confirmaSenha").value())) {
            	usuarioForm.reject("confirmaSenha", "Senha não combina.");
            }
        }
        
        // Check if the username is valid
        if(!usuarioForm.hasErrors()) {
            if(usuarioForm.get().usuario.equals("teste1") || usuarioForm.get().usuario.equals("tset2")) {
            	usuarioForm.reject("usuario", "This username is already taken");
            }
        }
        
        if(usuarioForm.hasErrors()) {
            return badRequest(editForm.render(id, usuarioForm));
        }
        usuarioForm.get().update(id);
        flash("success", "Usuário " + usuarioForm.get().nome + " has been updated");
        return GO_USUARIOS;
    }
    
    /**
     * Mostra o form de novo usuario
     */
    public static Result create() {
        Form<Usuario> usuarioForm = form(Usuario.class);
        return ok(
            createForm.render(usuarioForm)
        );
    }
    
    /**
     * Trata submissao de um novo usuario
     */
    public static Result save() {
        Form<Usuario> usuarioForm = form(Usuario.class).bindFromRequest();
        
        // Check repeated password
        if(!usuarioForm.field("senha").valueOr("").isEmpty()) {
            if(!usuarioForm.field("senha").valueOr("").equals(usuarioForm.field("confirmaSenha").value())) {
            	usuarioForm.reject("confirmaSenha", "Senha não combina.");
            }
        }
        
        // Check if the username is valid
        if(!usuarioForm.hasErrors()) {
            if(usuarioForm.get().usuario.equals("teste1") || usuarioForm.get().usuario.equals("tset2")) {
            	usuarioForm.reject("usuario", "This username is already taken");
            }
        }
        
        if(usuarioForm.hasErrors()) {
            return badRequest(createForm.render(usuarioForm));
        }
        
       

        
        usuarioForm.get().save();
        flash("success", "Usuário " + usuarioForm.get().nome + " cadastrado com sucesso");
        return GO_USUARIOS;
    }
    
    /**
     * Trata remocao de usuario
     */
    public static Result delete(Long id) {
        Usuario.find.ref(id).delete();
        flash("success", "Usuário has been deleted");
        return GO_USUARIOS;
    }
}